package network.ssl.image;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import ucp.projects.kraken.kamcenter.plugin.CameraFrame;


public class KrakenImageThread implements Runnable {
	
	private Thread thread;
	private Socket socket;
	private PrintWriter out; // pour gestion du flux de sortie
	//private BufferedReader in; // pour gestion du flux d'entree
	private ObjectInputStream inputStream; // pour gestion des objets images
	private KrakenImageThreadServer krakenImageServer;
	private int numClient = 0;
	private CameraFrame frame;
	private boolean run;
	
	final Lock lock = new ReentrantLock();
	final Condition turn = lock.newCondition();
	
	public KrakenImageThread(Socket s, KrakenImageThreadServer kits){
		krakenImageServer = kits;
		socket = s;
		//rci = null;
		frame = null;
		run = true;
		try{
			// fabrication d'une variable permettant l'utilisation du flux de sortie avec des string
			out = new PrintWriter(socket.getOutputStream());
			// fabrication d'une variable permettant l'utilisation du flux d'entree avec des string
			//in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			inputStream = new ObjectInputStream(socket.getInputStream());
			// ajoute le flux de sortie dans la liste et recuperation de son numero
			numClient = krakenImageServer.addClient(out);
		}
		catch(IOException e){
			e.printStackTrace(); //
		}
	
		thread = new Thread(this);
		thread.start();
	}

	@Override
	public void run() {
		// on indique dans la console la connection d'un nouveau client
		System.out.println(this.getKrakenImageThreadServer().getPort()+":Un nouveau client s'est connecte, no " + numClient);
		String camIP;
		try{
			while(run){
				//System.out.println("AttenteImage");
				frame = (CameraFrame) inputStream.readUnshared();
				camIP = frame.getSourceName().split("-")[1];
				this.krakenImageServer.insertFrameIntoMap(camIP, frame);
			}
		}
		catch(Exception e){
			e.printStackTrace(); //
		}
		
		finally{ // finally se produira le plus souvent lors de la deconnexion du client
			try{
				System.out.println(this.getKrakenImageThreadServer().getPort()+":Le client no " + numClient + " s'est deconnecte");
				krakenImageServer.delClient(numClient); 
				socket.close();
			}
			catch(IOException e){
				e.printStackTrace(); //
			}
		}
	}

	
	/**
	 * Envoi un message au client.
	 * @param cmd
	 */
	public void sendCommand(String cmd){
		out.println(cmd);
		out.flush();
	}
	
	public KrakenImageThreadServer getKrakenImageThreadServer(){ return this.krakenImageServer; }

	public Socket getSocket() { return socket; }
	public void setSocket(Socket socket) { this.socket = socket; }
	
	public boolean getRunState(){ return this.run;	}
	public void setRunOff(){ this.run = false;	}
	
}
